{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import log_loss\n",
    "from matplotlib import pyplot\n",
    "import os\n",
    "import random as rd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C:\\Users\\62744\\Desktop\n"
     ]
    }
   ],
   "source": [
    "print os.getcwd()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0      1\n",
      "1      0\n",
      "2      1\n",
      "3      0\n",
      "4      1\n",
      "5      0\n",
      "6      1\n",
      "7      0\n",
      "8      1\n",
      "9      1\n",
      "10     0\n",
      "11     1\n",
      "12     0\n",
      "13     1\n",
      "14     1\n",
      "15     1\n",
      "16     1\n",
      "17     1\n",
      "18     0\n",
      "19     1\n",
      "20     0\n",
      "21     0\n",
      "22     1\n",
      "23     1\n",
      "24     1\n",
      "25     1\n",
      "26     1\n",
      "27     0\n",
      "28     0\n",
      "29     0\n",
      "      ..\n",
      "738    0\n",
      "739    1\n",
      "740    1\n",
      "741    0\n",
      "742    0\n",
      "743    1\n",
      "744    0\n",
      "745    0\n",
      "746    1\n",
      "747    0\n",
      "748    1\n",
      "749    1\n",
      "750    1\n",
      "751    0\n",
      "752    0\n",
      "753    1\n",
      "754    1\n",
      "755    1\n",
      "756    0\n",
      "757    1\n",
      "758    0\n",
      "759    1\n",
      "760    0\n",
      "761    1\n",
      "762    0\n",
      "763    0\n",
      "764    0\n",
      "765    0\n",
      "766    1\n",
      "767    0\n",
      "Name: Outcome, Length: 768, dtype: int64\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "train = pd.read_csv('diabetes.csv')\n",
    "y = train['Outcome']\n",
    "\n",
    "# for i in range(len(y)):\n",
    "#     y.iloc[i] += 1\n",
    "print y\n",
    "x = train.drop(['Outcome'], axis=1)\n",
    "randnum = rd.choice([0, 1, 2, 3, 4])\n",
    "print randnum\n",
    "\n",
    "test_y = y[int(len(y)*0.2*randnum):int(len(y)*0.2*(randnum+1))]\n",
    "train_y = pd.concat([y[:int(len(y)*0.2*randnum)],y[int(len(y)*0.2*(randnum+1)):]])\n",
    "\n",
    "test_x = x[int(len(x)*0.2*randnum):int(len(x)*0.2*(randnum+1))]\n",
    "train_x = pd.concat([x[:int(len(x)*0.2*randnum)],x[int(len(x)*0.2*(randnum+1)):]])\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "# train_x = ss_X.fit_transform(train_x)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "lr= LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [ 0.5278659   0.49668042  0.56758232  0.47161875  0.50894449]\n",
      "cv logloss is: 0.514538375823\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优（模型选择）\n",
    "#分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lr, train_x, train_y, cv=5, scoring='neg_log_loss')\n",
    "print 'logloss of each fold is: ',-loss\n",
    "print'cv logloss is:', -loss.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression()\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss')\n",
    "grid.fit(train_x,train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.501829701198\n",
      "{'penalty': 'l2', 'C': 100}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nZmaZ+C9XE4bKvJs2OAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe855940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'neg-logloss' )\n",
    "pyplot.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1: array([[-0.51130661, -0.51297808, -0.51329019, -0.51332124],\n",
      "       [-0.48502495, -0.48165807, -0.4813885 , -0.48136056],\n",
      "       [-0.57452352, -0.57500509, -0.57515007, -0.57516528],\n",
      "       [-0.45036471, -0.44976564, -0.44980367, -0.44979382],\n",
      "       [-0.49059886, -0.48987487, -0.48990902, -0.48991197]])}\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "Cs = [1, 10,100,1000]\n",
    "\n",
    "# 大量样本（6W+）、高维度（93），L1正则 --> 可选用saga优化求解器(0.19版本新功能)\n",
    "# LogisticRegressionCV比GridSearchCV快\n",
    "lrcv_L1 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l1', solver='liblinear', multi_class='ovr')\n",
    "lrcv_L1.fit(train_x, train_y) \n",
    "print lrcv_L1.scores_\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1: array([[-0.51130661, -0.51297808, -0.51329019, -0.51332124],\n",
       "        [-0.48502495, -0.48165807, -0.4813885 , -0.48136056],\n",
       "        [-0.57452352, -0.57500509, -0.57515007, -0.57516528],\n",
       "        [-0.45036471, -0.44976564, -0.44980367, -0.44979382],\n",
       "        [-0.49059886, -0.48987487, -0.48990902, -0.48991197]])}"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrcv_L1.scores_\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "0",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0mTraceback (most recent call last)",
      "\u001b[1;32m<ipython-input-168-b14a21cdcb89>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mn_classes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m     \u001b[0mscores\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlrcv_L1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscores_\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mj\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0maxis\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      9\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     10\u001b[0m \u001b[0mmse_mean\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m-\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 0"
     ]
    }
   ],
   "source": [
    "# scores_：dict with classes as the keys, and the values as the grid of scores obtained during cross-validating each fold,\n",
    "# Each dict value has shape (n_folds, len(Cs))\n",
    "n_Cs = len(Cs)\n",
    "n_classes = 1\n",
    "scores =  np.zeros((n_classes,n_Cs))\n",
    "\n",
    "for j in range(n_classes):\n",
    "    scores[j][:] = np.mean(lrcv_L1.scores_[j],axis = 0)\n",
    "    \n",
    "mse_mean = -np.mean(scores, axis = 0)\n",
    "pyplot.plot(np.log10(Cs), mse_mean.reshape(n_Cs,1)) \n",
    "#plt.plot(np.log10(reg.Cs)*np.ones(3), [0.28, 0.29, 0.30])\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('neg-logloss')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.11043709,  0.03603688, -0.01096852,  0.00376549, -0.0019097 ,\n",
       "         0.07689452,  0.82636167,  0.01583947]])"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrcv_L1.coef_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\62744\\Anaconda2\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2010: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import accuracy_score\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'metrics' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m\u001b[0m",
      "\u001b[1;31mNameError\u001b[0mTraceback (most recent call last)",
      "\u001b[1;32m<ipython-input-172-c91cbe8c5a17>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m print(\"Classification report for classifier %s:\\n%s\\n\"\n\u001b[1;32m----> 5\u001b[1;33m       % (SVC1, metrics.classification_report(y_val, y_predict)))\n\u001b[0m\u001b[0;32m      6\u001b[0m \u001b[1;32mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Confusion matrix:\\n%s\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconfusion_matrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0my_val\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_predict\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'metrics' is not defined"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.805194805195\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.766233766234\n",
      "accuracy: 0.779220779221\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\62744\\Anaconda2\\lib\\site-packages\\matplotlib\\axes\\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.\n",
      "  warnings.warn(\"No labelled objects found. \"\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XucVXW9//HXm5uYFzTBMlEhRRPNvIyYd/eqTO2XdldO\nnpNdtI5haWZhdlGLR3a0rNQsszKtNPKWpzT0yMUbKAMCBojiJZmj5mjeMBGBz++P757jNA7szcys\nWfvyfj4e89iz1qy992eLzJv1vSoiMDMzW5cBRRdgZma1z2FhZmYVOSzMzKwih4WZmVXksDAzs4oc\nFmZmVpHDwszMKnJYmJlZRQ4LMzOraFDRBfSV4cOHx6hRo4ouw8ysrsyZM+fpiBhR6bqGCYtRo0bR\n2tpadBlmZnVF0t+quc7NUGZmVpHDwszMKnJYmJlZRQ4LMzOryGFhZmYVOSzMzKwih4WZmVXUMPMs\nDJ57Dn76U/jnP4uuxBrVBhvASSfBppsWXYn1t1zDQtJhwI+AgcClEXFOl59vC/wa2Kx8zcSIuFHS\nOOCSjsuAMyPiujxrbQSf/SxMngxS0ZVYI4pIj5ttBp//fLG1WP/LLSwkDQQuAt4DtAGzJd0QEYs6\nXfZ1YHJEXCxpLHAjMAr4K9ASEaskbQXMl/TfEbEqr3rr3Q03pKCYNAm+9rWiq7FGFAGjR8O0aQ6L\nZpRnn8U4YGlEPBwRK4GrgKO6XBNAxw3tMOBxgIj4Z6dgGFq+ztbi+efhxBPh7W+H004ruhprVBKU\nSiks1qwpuhrrb3mGxdbAsk7HbeVznZ0JHCupjXRXcVLHDyTtI2khcB/wOd9VrN3pp8MTT8Cll8Lg\nwUVXY40sy+Af/4AFC4quxPpbnmHRXct51zuE8cBlETESOAK4QtIAgIi4OyJ2AfYGTpc09HVvIJ0g\nqVVSa3t7ex+XXx/uuAMuvhi++EUYN67oaqzRlUrpcdq0Yuuw/pdnWLQB23Q6Hkm5mamTTwOTASJi\nJqnJaXjnCyJiMfASsGvXN4iISyKiJSJaRoyouMJuw1mxAo4/HkaNgm9/u+hqrBmMHAljxsDUqUVX\nYv0tz7CYDYyRNFrSEOAY4IYu1zwGvAtA0s6ksGgvP2dQ+fx2wE7AoznWWpcmTYL774ef/Qw22qjo\naqxZZBnMmAGr3DDcVHILi3IfwwRgCrCYNOppoaSzJR1ZvuxU4HhJ84ErgeMiIoADSCOg5gHXASdG\nxNN51VqP7rsPzjkH/uM/4NBDi67GmkmWwYsvwpw5RVdi/UkRjTHQqKWlJZpl86PVq2G//eCRR2Dx\nYthii6Irsmby1FPwpjfBd78LEycWXY31lqQ5EdFS6Tov91GHLrwQ7rkHfvxjB4X1vy23hF13db9F\ns3FY1JlHH4UzzoD3vQ+OPrroaqxZZVkaiffKK0VXYv3FYVFHIuBzn0uTo37yEy/rYcXJMnj55XSH\na83BYVFHfvtbmDIltRVvu23R1VgzO+ig9I8VN0U1D4dFnWhvh5NPhn33TUt7mBVp881hzz0dFs3E\nYVEnTjkFXnghLekxwH9qVgOyDGbN8pL4zcK/durATTelJqgzzoCxY4uuxiwplWDlSrjrrqIrsf7g\nsKhxL76Y9qkYO9Zj2q22HHAADBrkpqhm4Z3yatzXvw5tbXDnnWmXMrNasckmafFKLyrYHHxnUcNm\nzYILLoAJE1LHtlmtyTKYPTv1p1ljc1jUqJUr4TOfSat8TppUdDVm3SuV0vIzt99edCWWN4dFjTrn\nHFi4MO1VsckmRVdj1r19903No+63aHwOixq0aBF85zswfnxa1sOsVm24YVrU0v0Wjc9hUWPWrEkb\nGm26KfzoR0VXY1ZZqQTz5sEzzxRdieXJYVFjLr44jVs//3xows3/rA5lWVq3bMaMoiuxPDksasiy\nZWkuxaGHwrHHFl2NWXX23jvt1OimqMbmsKgREWnNpzVr0japXlHW6sWQIWmCnju5G5vDokZMngx/\n+lMaJjtqVNHVmK2fLEsDM558suhKLC8OixrwzDNw0knpdv6kk4quxmz9ZVl6nD690DIsRw6LGnDq\nqfDss2lF2YEDi67GbP3tsQcMG+amqEbmsCjYLbfAr38NX/0q7LZb0dWY9czAgXDwwQ6LRuawKNBL\nL6UVZXfaKS0YaFbPsgweeggee6zoSiwPuYaFpMMkLZG0VNLrFtiWtK2kaZLulbRA0hHl8++RNEfS\nfeXHLM86i/LNb8Ijj8DPfw5DhxZdjVnvdPRbeAhtY8otLCQNBC4CDgfGAuMldd265+vA5IjYAzgG\n+En5/NPA+yPi7cAngCvyqrMos2fDD38In/scHHhg0dWY9d4uu8Dw4W6KalR53lmMA5ZGxMMRsRK4\nCjiqyzUBbFr+fhjwOEBE3BsRj5fPLwSGSmqY3RxefTWtKPvmN6cFA80awYABaemPqVPTvCFrLHmG\nxdbAsk7HbeVznZ0JHCupDbgR6G7g6IeBeyPila4/kHSCpFZJre3t7X1TdT847zxYsCAt7TFsWNHV\nmPWdLEubdT30UNGVWF/LMyy6m4Pc9d8b44HLImIkcARwhaT/q0nSLsD3gM929wYRcUlEtEREy4g6\nWUhpyRI46yz46EfhyCOLrsasb5VK6dFNUY0nz7BoA7bpdDyScjNTJ58GJgNExExgKDAcQNJI4Drg\nPyKiIf6dsmYNnHBCWtb5xz8uuhqzvrfjjvCWtzgsGlGeYTEbGCNptKQhpA7sG7pc8xjwLgBJO5PC\nol3SZsCfgdMj4s4ca+xXl14Kt90G3/9+6q8wazRSaoqaNs39Fo0mt7CIiFXABGAKsJg06mmhpLMl\ndTTAnAocL2k+cCVwXERE+Xk7AN+QNK/8tWVetfaHxx+H005Lf5E++cmiqzHLT6kETz2V1oqyxjEo\nzxePiBtJHdedz32z0/eLgP27ed53gO/kWVt/ioDPfz7tq33JJV5R1hpbx3yLqVPTcFprDJ7B3Q+u\nvRauvx7OPhu2377oaszyNWoUjB7tyXmNxmGRs2efhQkT0kJrp5xSdDVm/aNUSivQrl5ddCXWVxwW\nOfvKV6C9HX7xCxiUa6OfWe3IsvQPpfnzi67E+orDIkfTpqURUF/+crqzMGsWHfMt3BTVOBwWOXn5\n5TSnYvvt4VvfKroas/71lrfA297m+RaNxGGRk7POgqVL04qyG25YdDVm/a9USvOKXn216EqsLzgs\ncnDvvWn9p09/+rXbcbNmk2WwfDm0thZdifUFh0UfW7UqrSg7YgSce27R1ZgV55BD0qP7LRqDw6KP\nnX8+zJ0LF14Im29edDVmxRk+PG0V7H6LxuCw6ENLl6bd7z7wAfjQh4quxqx4WQZ33gmvvG6DAas3\nDos+EpH20x4yJN1VeEkPsxQWK1bArFlFV2K95bDoI5ddlm63zz0Xtu66xZNZkzrooLSDnpui6p/D\nog88+SR86UvpL8ZnPlN0NWa1Y9gw2Gsvh0UjcFj0gS98IU3Cu+SS9K8oM3tNlsHdd8NLLxVdifWG\nf7X10h//CH/4Q+rY3mmnoqsxqz1Zlibm3dkw25g1J4dFLzz/PJx4YhoeeNppRVdjVpv23x8GD3ZT\nVL3zOqi9MHFi6q+4/vr0l8HMXm+jjWCffRwW9c53Fj10++3w05/CySfD3nsXXY1ZbcsymDMn3Y1b\nfXJY9MCKFXD88WlHsLPPLroas9pXKsGaNWlhQatPDosemDQJliyBn/0s3WKb2bq9850wdKibouqZ\nw2I9LVgA55wDn/gEHHpo0dWY1YehQ1NHtxcVrF+5hoWkwyQtkbRU0sRufr6tpGmS7pW0QNIR5fNb\nlM8vl3RhnjWuj9Wr06S7zTeH73+/6GrM6kuplLZZffrpoiuxnsgtLCQNBC4CDgfGAuMlje1y2deB\nyRGxB3AM8JPy+RXAN4Av51VfT1xwAcyeDT/+MWyxRdHVmNWXLEuP06cXWob1UJ53FuOApRHxcESs\nBK4CjupyTQCblr8fBjwOEBEvRcQdpNCoCY8+CmecAe97Hxx9dNHVmNWflhbYeGM3RdWrPOdZbA0s\n63TcBuzT5ZozgZslnQRsBLw7x3p6rGNF2QED4OKLvaKsWU8MHgwHHuhO7nqV551Fd79So8vxeOCy\niBgJHAFcIanqmiSdIKlVUmt7e3svSl233/wGbr45dWxvs01ub2PW8LIM7r8fHn+86EpsfeUZFm1A\n51+tIyk3M3XyaWAyQETMBIYCw6t9g4i4JCJaIqJlxIgRvSy3e089lSbe7bsv/Od/5vIWZk3D/Rb1\nK8+wmA2MkTRa0hBSB/YNXa55DHgXgKSdSWGR3y1CD5xyStp0/tJLvaKsWW+94x1pNKGboupPbn0W\nEbFK0gRgCjAQ+GVELJR0NtAaETcApwI/l3QKqYnquIgIAEmPkjq/h0j6AHBoRCzKq97u/PnP8Lvf\nwVlnwdiu47jMbL0NHAgHH+ywqEcq/26uey0tLdHa2tpnr/fii7DLLrDppjB3btou1cx674IL0h4w\njzySlsyxYkmaExEtla5zw8panHEGtLXBz3/uoDDrSx39Fh5CW18cFt2YORMuvBAmTEgd22bWd8aO\nhS23dFNUvXFYdPHKK2lJj222SQsGmlnfktLSH1OnpjlMVh8cFl2ccw4sWpT2qthkk6KrMWtMWZbm\nWjz4YNGVWLUcFp0sWpTuJv7t3+Dww4uuxqxxlUrp0U1R9cNhUbZmTWp+2nRT+OEPi67GrLHtsAOM\nHOmwqCfeg7vs4otTx/bll0NOk8HNrExKTVE33ZT+oeYJr7XPf0TAY4/BxInw3vfCsccWXY1ZcyiV\noL0dFi4suhKrRtOHRURa82nNmtSp7RVlzfqH+y3qS1VhIekaSe9bnxVh68WDD6bJQZMmeTapWX/a\nbjvYfntPzqsX1f7yvxj4N+BBSedIeluONfWrHXdMo6BOOqnoSsyaT5alFWhXry66EqukqrCIiP+J\niI8DewKPArdIukvSJyUNzrPA/jBqVFrgzMz6V6kEzz8P995bdCVWyfpsNLQFcBzwGeBe4Eek8Lgl\nl8rMrOG536J+VNtncS1wO/AG4P0RcWRE/D4iTgI2zrNAM2tcb35zWivK/Ra1r9p5FhdGRLfZX83S\ntmZma1MqwWWXwcqVXuG5llXbDLWzpM06DiRtLunEnGoysyaSZfDSSzB7dtGV2LpUGxbHR8RzHQcR\n8SxwfD4lmVkzOfjgNL/JTVG1rdqwGCC9Nl1N0kDAN4xm1mtbbJH25nYnd22rNiymAJMlvUtSBlwJ\n/CW/ssysmWQZ3HUXrFhRdCW2NtWGxVeBqcB/Ap8HbgW+kldRZtZcsixtPDZzZtGV2NpUNRoqItaQ\nZnFfnG85ZtaMDjwwTYydOvW1uRdWW6qdZzFG0tWSFkl6uOOriucdJmmJpKWSJnbz820lTZN0r6QF\nko7o9LPTy89bIum96/exzKyebLoptLS436KWVdsM9SvSXcUqoARcDlyxrieUO8EvAg4HxgLjJY3t\nctnXgckRsQdwDPCT8nPHlo93AQ4DflJ+PTNrUFkG99wDy5cXXYl1p9qw2DAibgUUEX+LiDOBrMJz\nxgFLI+LhiFgJXAUc1eWaADYtfz8MeLz8/VHAVRHxSkQ8Aiwtv56ZNagsg1Wr4I47iq7EulNtWKwo\nL0/+oKQJkj4IbFnhOVsDyzodt5XPdXYmcKykNuBGoGPt12qea2YNZL/9YPBgN0XVqmrD4mTSulBf\nAPYCjgU+UeE53W0jFF2OxwOXRcRI4AjginIoVfNcJJ0gqVVSa3t7e4VyzKyWveENsO++DotaVTEs\nyn0FH4uI5RHRFhGfjIgPR8SsCk9tA7bpdDyS15qZOnwamAwQETOBocDwKp9LRFwSES0R0TLCG2eb\n1b0sS8uVP/ts0ZVYVxXDIiJWA3t1nsFdpdnAGEmjJQ0hdVjf0OWax4B3AUjamRQW7eXrjpG0gaTR\nwBjgnvV8fzOrM6VS2uL4ttuKrsS6qnbV2XuBP0r6A/BSx8mIuHZtT4iIVZImkGZ/DwR+GRELJZ0N\ntEbEDcCpwM8lnUJqZjouIgJYKGkysIg0Auvz5dAyswa2zz6w4YapKeqorsNhrFBKv5srXCT9qpvT\nERGf6vuSeqalpSVaW1uLLsPMeunQQ+HJJ2HBgqIraQ6S5lSz1US1M7g/2fuSzMwqK5Xga1+Dp56C\nLSuNubR+U1VYlO8sXncLUkt3FmbWGLLyDK7p0+FjHyu0FOuk2qGzfwL+XP66lTSRzvMszazP7bUX\nbLKJ97eoNdU2Q13T+VjSlcD/5FKRmTW1QYPShkieb1Fbqr2z6GoMsG1fFmJm1qFUggcegLa2oiux\nDtWuOvuipBc6voD/Ju1xYWbW5zr6LdwUVTuqCouI2CQiNu30tWPXpikzs76y227wxjc6LGpJtXcW\nH5Q0rNPxZpI+kF9ZZtbMBgyAQw6BW2+FKqaCWT+ots/iWxHxfMdBRDwHfCufkszMUlPUY4/BI48U\nXYlB9WHR3XXVLhViZrbe3G9RW6oNi1ZJP5C0vaS3SjofmJNnYWbW3N72Nnjzmz2EtlZUGxYnASuB\n35OWFH8Z+HxeRZmZSWkI7dSp7reoBdVOynsJmJhzLWZm/yLL4MorYcmSdKdhxal2NNQtkjbrdLy5\npCn5lWVmlu4swE1RtaDaZqjh5RFQAETEs1Teg9vMrFfe+lbYdluHRS2oNizWSPq/5T0kjaKbVWjN\nzPqSlJqipk9PO+hZcaoNizOAOyRdIekKYAZwen5lmZklWQbPPAP33Vd0Jc2t2uU+/gK0AEtII6JO\nJY2IMjPLlfstakO1HdyfIe1jcWr56wrgzPzKMjNLRo6EMWMcFkWrthnqi8DewN8iogTsAbTnVpWZ\nWSdZBrfdBqtWFV1J86o2LFZExAoASRtExP3ATvmVZWb2mlIJXngB5s4tupLmVW1YtJXnWVwP3CLp\nj8Dj+ZVlZvaaQw5Jj26KKk61HdwfjIjnIuJM4BvAL4CKS5RLOkzSEklLJb1uBrik8yXNK389IOm5\nTj/7nqS/lr+Orv4jmVmjedObYNddvahgkdZ75diImFHNdZIGAhcB7wHagNmSboiIRZ1e65RO159E\n6gtB0vuAPYHdgQ2AGZJuiogX1rdeM2sMpRJceimsXAlDhhRdTfPp6R7c1RgHLI2IhyNiJXAVcNQ6\nrh8PXFn+fiwwIyJWldelmg8clmOtZlbjsgxefhnuvrvoSppTnmGxNbCs03Fb+dzrSNoOGA10tEjO\nBw6X9AZJw4ESsE2OtZpZjTv44DSj201RxcgzLNTNubUtEXIMcHVErAaIiJuBG4G7SHcbM4HXDZqT\ndIKkVkmt7e0eyWvWyDbfHPbc053cRckzLNr417uBkax9BNUxvNYEBUBETIqI3SPiPaTgebDrkyLi\nkohoiYiWESNG9FHZZlarSiWYOTM1R1n/yjMsZgNjJI2WNIQUCDd0vUjSTsDmpLuHjnMDJW1R/n43\nYDfg5hxrNbM6kGWpg/uuu4qupPnkFhYRsQqYAEwBFgOTI2KhpLMlHdnp0vHAVRH/shfWYOB2SYuA\nS4Bjy69nZk3sgANg0CA3RRVB0SD7Fba0tERra2vRZZhZzvbbL22zOnNm5WutMklzIqKl0nV5NkOZ\nmfW5LIPZs+HFF4uupLk4LMysrmQZrF4Nt99edCXNxWFhZnVl333TDG73W/Qvh4WZ1ZUNN0z9Fg6L\n/uWwMLO6k2Uwbx784x9FV9I8HBZmVndKpTQiakZVy5paX3BYmFndGTcO3vAGN0X1J4eFmdWdIUPg\nwAO9qGB/cliYWV3KMli4EP7+96IraQ4OCzOrS6VSevTdRf9wWJhZXdpjDxg2zP0W/cVhYWZ1adCg\ntCGS7yz6h8PCzOpWqQRLl8JjjxVdSeNzWJhZ3cqy9Oi7i/w5LMysbu26Kwwf7rDoDw4LM6tbAwbA\nIYekTu4G2ZqnZjkszKyuZRksWwYPPVR0JY3NYWFmdc39Fv3DYWFmdW3HHWGrrTzfIm8OCzOra1K6\nu5g2zf0WeXJYmFndy7K0RtTixUVX0rhyDQtJh0laImmppInd/Px8SfPKXw9Ieq7Tz/5L0kJJiyX9\nWJLyrNXM6ldHv4WbovKTW1hIGghcBBwOjAXGSxrb+ZqIOCUido+I3YELgGvLz90P2B/YDdgV2Bs4\nOK9azay+jRqVvhwW+cnzzmIcsDQiHo6IlcBVwFHruH48cGX5+wCGAkOADYDBgBciNrO1yjKYPh3W\nrCm6ksaUZ1hsDSzrdNxWPvc6krYDRgNTASJiJjANeKL8NSUi3BppZmuVZfDsszB/ftGVNKY8w6K7\nPoa1jVU4Brg6IlYDSNoB2BkYSQqYTNJBr3sD6QRJrZJa29vb+6hsM6tHHftbuCkqH3mGRRuwTafj\nkcDja7n2GF5rggL4IDArIpZHxHLgJuCdXZ8UEZdEREtEtIwYMaKPyjazevSWt8BOOzVfWNx7L0yZ\nkv/75BkWs4ExkkZLGkIKhBu6XiRpJ2BzYGan048BB0saJGkwqXPbzVBmtk5ZBrfdBq++WnQl/eNX\nv4J994Uvfzn/vprcwiIiVgETgCmkX/STI2KhpLMlHdnp0vHAVRH/Mp3mauAh4D5gPjA/Iv47r1rN\nrDGUSrB8OcyZU3Ql+VqxAk44AT71Kdh//3Q3NSDnWXOD8nzxiLgRuLHLuW92OT6zm+etBj6bZ21m\n1ngOOSQ9Tp0K73xdw3Vj+Nvf4CMfgdZWmDgRvv3ttGtg3jyD28waxogRsNtujbuo4M03w557wgMP\nwPXXw3e/2z9BAQ4LM2swWQZ33AGvvFJ0JX1nzRr4znfgsMNSR35rKxy1rllrOXBYmFlDKZVSm/6s\nWUVX0jeeey4Fwze+AePHp881Zkz/1+GwMLOGctBBqbO3EZqi5s+HvfaCv/wFLrgAfvMb2GijYmpx\nWJhZQ9lss/QLtt7nW1x+eeqkX7ECZsyACRPScuxFcViYWcMplVJzzUsvFV3J+nvlFTjxRPjEJ1JY\nzJ0L++1XdFUOCzNrQFmWJubdeWfRlayfZctSM9rFF8Npp8Ett8Cb3lR0VYnDwswazgEHpCGl9dRv\nceutaVjs4sVw9dXwX//Vf8Niq+GwMLOGs9FGsM8+9dFvEQHnnAOHHgpbbgmzZ8OHP1x0Va/nsDCz\nhpRlaT7C888XXcnaPf88fOhDcPrp8NGPwt13p8UQa5HDwswaUpalyWy33150Jd277z7Ye2/405/g\nhz+EK6+EjTcuuqq1c1iYWUN65zthgw1qsynqd79L9b34YupX+eIXix0WWw2HhZk1pKFDX1uRtVas\nXAlf+AJ8/ONpLsjcuakzvh44LMysYWVZmgX9zDNFVwL/+79pVdwLLoBTTkmjn7baquiqquewMLOG\nlWXpcfr0Qstg+vQ0LHbBAvj97+EHP4DBg4utaX05LMysYbW0pGG0RTVFRcB558G73w1vfCPccw98\n7GPF1NJbNTTlw8ysbw0enGZEFxEWL7yQdrK75pq0WdEvfwmbbNL/dfQV31mYWUPLMrj/fnjiif57\nz0WLYNy4tEHReefB5Mn1HRTgsDCzBlcqpcf+Wvrj979PQfHss6kT+9RTa39YbDUcFmbW0HbfPS1b\nnndT1KuvplFOxxwD73hHGhZ78MH5vmd/cp+FmTW0gQPTkNU87yyeeCJ1XN9xR5pHce65MGRIfu9X\nBN9ZmFnDK5Xg4Yfh0Uf7/rVvvz0Ni507N83M/tGPGi8oIOewkHSYpCWSlkqa2M3Pz5c0r/z1gKTn\nyudLnc7Pk7RC0gfyrNXMGlfHfIu+vLuIgPPPT0G0ySZpEcDx4/vu9WtNbmEhaSBwEXA4MBYYL2ls\n52si4pSI2D0idgcuAK4tn5/W6XwG/BO4Oa9azayx7bILjBjRd2GxfHnqm/jSl+D970/Liu+6a9+8\ndq3K885iHLA0Ih6OiJXAVcBR67h+PHBlN+c/AtwUEf/MoUYzawJSugOYOjXdEfTG/fen0U5XX532\nobj2Whg2rG/qrGV5hsXWwLJOx23lc68jaTtgNNDdeIVj6D5EkHSCpFZJre3t7b0s18waWZal9Zke\nfLDnr3HNNWlZ8aefTluefvWrjTEsthp5hkV3/wnXlunHAFdHxOp/eQFpK+DtwJTunhQRl0RES0S0\njBgxolfFmllj602/xapVaU/sj3wkNWnNnfva6zWLPMOiDdim0/FI4PG1XLu2u4ePAddFxKt9XJuZ\nNZkddoCRI9d/vsXf/57WdjrvPDjxRJgxI71Os8kzLGYDYySNljSEFAg3dL1I0k7A5sDMbl5jbf0Y\nZmbrpaPfYtq0tINeNe66Kw2LveceuPxyuOiitKFSM8otLCJiFTCB1IS0GJgcEQslnS3pyE6Xjgeu\nivjXbidJo0h3JjPyqtHMmkuWQXs7LFy47usi0r4TBx8MG24Is2bBv/97/9RYq3KdwR0RNwI3djn3\nzS7HZ67luY+ylg5xM7Oe6LxO1Nvf3v01L70Exx+f9sR+//vTHcVmm/VfjbXKM7jNrGlstx289a1r\n77d44IG0N/ZVV8GkSWnVWAdF4rWhzKypZBn84Q+wenVaN6rDddfBccelPTCmTIH3vKewEmuS7yzM\nrKlkGTz/PMybl45XrYKJE+FDH4Idd0zDYh0Ur+ewMLOmcsgh6XHqVHjqKXjve+F734PPfjatGrvt\ntoWWV7McFmbWVLbaCnbeGa64AvbaKw2P/dWv4Kc/bd5hsdVwWJhZ08kyuO++1D9x112pr8LWzR3c\nZtZ0Tj4ZNtoore30xjcWXU19cFiYWdPZYYfUT2HVczOUmZlV5LAwM7OKHBZmZlaRw8LMzCpyWJiZ\nWUUOCzMzq8hhYWZmFTkszMysInXZoK5uSWoH/taLlxgOPN1H5RSpUT4H+LPUqkb5LI3yOaB3n2W7\niBhR6aKGCYvektQaES1F19FbjfI5wJ+lVjXKZ2mUzwH981ncDGVmZhU5LMzMrCKHxWsuKbqAPtIo\nnwP8WWpVo3yWRvkc0A+fxX0WZmZWke8szMysIodFmaRvS1ogaZ6kmyW9peiaekrSuZLuL3+e6yRt\nVnRNPSULB8NOAAAEvklEQVTpo5IWSlojqe5Grkg6TNISSUslTSy6nt6Q9EtJT0n6a9G19IakbSRN\nk7S4/P/WF4uuqackDZV0j6T55c9yVm7v5WaoRNKmEfFC+fsvAGMj4nMFl9Ujkg4FpkbEKknfA4iI\nrxZcVo9I2hlYA/wM+HJEtBZcUtUkDQQeAN4DtAGzgfERsajQwnpI0kHAcuDyiNi16Hp6StJWwFYR\nMVfSJsAc4AP1+OciScBGEbFc0mDgDuCLETGrr9/LdxZlHUFRthFQtykaETdHxKry4SxgZJH19EZE\nLI6IJUXX0UPjgKUR8XBErASuAo4quKYei4jbgH8UXUdvRcQTETG3/P2LwGJg62Kr6plIlpcPB5e/\ncvnd5bDoRNIkScuAjwPfLLqePvIp4Kaii2hSWwPLOh23Uae/lBqVpFHAHsDdxVbSc5IGSpoHPAXc\nEhG5fJamCgtJ/yPpr918HQUQEWdExDbAb4EJxVa7bpU+S/maM4BVpM9Ts6r5LHVK3Zyr2zvWRiNp\nY+Aa4OQuLQt1JSJWR8TupBaEcZJyaSIclMeL1qqIeHeVl/4O+DPwrRzL6ZVKn0XSJ4D/B7wrarxj\naj3+XOpNG7BNp+ORwOMF1WKdlNv3rwF+GxHXFl1PX4iI5yRNBw4D+nwQQlPdWayLpDGdDo8E7i+q\nlt6SdBjwVeDIiPhn0fU0sdnAGEmjJQ0BjgFuKLimplfuFP4FsDgiflB0Pb0haUTHaEdJGwLvJqff\nXR4NVSbpGmAn0sibvwGfi4j/LbaqnpG0FNgAeKZ8alYdj+z6IHABMAJ4DpgXEe8ttqrqSToC+CEw\nEPhlREwquKQek3QlcAhphdO/A9+KiF8UWlQPSDoAuB24j/T3HeBrEXFjcVX1jKTdgF+T/v8aAEyO\niLNzeS+HhZmZVeJmKDMzq8hhYWZmFTkszMysIoeFmZlV5LAwM7OKHBZm60HS8spXrfP5V0t6a/n7\njSX9TNJD5RVDb5O0j6Qh5e+batKs1TaHhVk/kbQLMDAiHi6fupS0MN+YiNgFOA4YXl508Fbg6EIK\nNeuGw8KsB5ScW17D6j5JR5fPD5D0k/Kdwp8k3SjpI+WnfRz4Y/m67YF9gK9HxBqA8uq0fy5fe335\nerOa4Ntcs575ELA78A7SjObZkm4D9gdGAW8HtiQtf/3L8nP2B64sf78LaTb66rW8/l+BvXOp3KwH\nfGdh1jMHAFeWV/z8OzCD9Mv9AOAPEbEmIp4EpnV6zlZAezUvXg6RleXNecwK57Aw65nulh9f13mA\nl4Gh5e8XAu+QtK6/gxsAK3pQm1mfc1iY9cxtwNHljWdGAAcB95C2tfxwue/iTaSF9zosBnYAiIiH\ngFbgrPIqqEga07GHh6QtgPaIeLW/PpDZujgszHrmOmABMB+YCnyl3Ox0DWkfi7+S9g2/G3i+/Jw/\n86/h8RngzcBSSfcBP+e1/S5KQN2tgmqNy6vOmvUxSRtHxPLy3cE9wP4R8WR5v4Fp5eO1dWx3vMa1\nwOl1vP+4NRiPhjLre38qb0gzBPh2+Y6DiHhZ0rdI+3A/trYnlzdKut5BYbXEdxZmZlaR+yzMzKwi\nh4WZmVXksDAzs4ocFmZmVpHDwszMKnJYmJlZRf8fzDzvtNgVLhUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xd5c9c50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.850649350649\n",
      "accuracy: 0.961038961039\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.902597402597\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.811688311688\n",
      "accuracy: 0.928571428571\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.720779220779\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.720779220779\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.720779220779\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.811688311688\n"
     ]
    }
   ],
   "source": [
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, -2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xd722630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
